const conversation = require('./conversation.js')
const msg = require('./msg.js')
const push = require('./push.js')
const wjf_push = require('./wjf-push.js')
const friend = require('./friend.js')
const group = require('./group.js')
const group_assistants = require('./group-assistants.js')
const filtered_conversation = require('./filtered-conversation.js')
const tools = require('./tools.js')

const testApi=require('./test-api.js')
const lang={
	'zh-Hans':require('./lang/zh-hans.js')
}
module.exports = {
	async _before() { // 通用预处理器
	
		/**
		 * 将多语言方法挂在this上，全局使用
		 * 使用方法：this.lang[语言名][多语言key]
		 * 使用这种方法进行设置，在语言数据方面与i18n一致，且使用方法容易理解
		 */
		this.lang=lang
	
		// 记录请求时间
		this.requestStartTime = Date.now()

		// 获取客户端信息
		this.clientInfo = this.getClientInfo()
		// 获取客户端调用时的参数
		// this.clientparams=this.getParams()

		// 调用扩展插件的初始化接口
		const {
			invokeExts
		} = require('uni-im-ext')
		await invokeExts('ext-init', this.clientInfo)

		// 定义uni-id公共模块对象
		const uniIdCommon = require('uni-id-common')
		// 主要用于下面验证token
		this.uniIdCommon = uniIdCommon.createInstance({
			clientInfo: this.clientInfo
		})

		// 除非特定方法允许未登录用户调用，其它都需要验证用户的身份
		const allowedMethodsWithouLogin = []
		if (!allowedMethodsWithouLogin.includes(this.getMethodName())) {
			if (this.getClientInfo().source == 'function') {
				// 云函数互调时，免校验 token 直接使用传来的用户 id
				this.current_uid = this.getParams()[1]
				this.current_user_role = []
				
			} else {
				// 客户端调用时验证 uni-id token
				let res = await this.uniIdCommon.checkToken(this.clientInfo.uniIdToken)
				// console.log('checkToken res',res);
				if (res.errCode) {
					// 如果token校验出错，则抛出错误
					throw res
				}

				// token 有效，取出 id 和角色
				this.current_uid = res.uid
				this.current_user_role = res.role
			}
		}

		// 为方便云对象内部调用 sendPushMsg() 方法，把它挂在云对象实例上
		this.sendPushMsg = push.sendPushMsg
		this.commPushMsg=wjf_push.commPushMsg

		// 提供一个方法，用于添加并发任务
		this._promises = []
		this.addPromise = (promise) => {
			this._promises.push(promise)
		}
	},
	async _after(error, result) {
		// 请求完成时间
		// console.error('请求完成时间', Date.now() - this.requestStartTime, 'ms')
		if (error) {
			// console.log({
			// 	error,
			// 	result
			// });
			if (error.errCode && error.errMsg) {
				// 符合响应体规范的错误，直接返回
				return error
			} else {
				throw error // 直接抛出异常
			}
		}

		// 如果有并发任务，则等它们都执行完再返回
		if (this._promises.length > 0) {
			await Promise.all(this._promises)
		}

		// console.error('云函数结束时间', Date.now() - this.requestStartTime, 'ms')

		return result || {
			errCode: 0
		}
	},
	
	...conversation,
	...msg,
	...push,
	...friend,
	...group,
	...group_assistants,
	...filtered_conversation,
	...tools,
	...testApi
	
	
	/**
	 * method1方法描述
	 * @param {string} param1 参数1描述
	 * @returns {object} 返回值描述
	 */
	/* 
	method1(param1) {
		// 参数校验，如无参数则不需要
		if (!param1) {
			return {
				errCode: 'PARAM_IS_NULL',
				errMsg: '参数不能为空'
			}
		}
		// 业务逻辑
		
		// 返回结果
		return {
			param1 //请根据实际需要返回值
		}
	}
	*/
}